题目:https://github.com/giantbranch/CTF_PWN/tree/master/2018/tie3/myhouse
保护措施,got表可写,没开PIE
1 | gdb-peda$ checksec |
一开始看到add_house有个size-1,这不是堆溢出吗,结果应该是由于size过大,read不了,只能找其他出路
1 | read(0, housed, size - 1); |
不断尝试,发现下面的v3是可以跟size是不一致的,第一次可以大于0x30000,控制v3,那么就可以任意地址写NULL
1 | unsigned __int64 add_house() |
难点在于add_house的漏洞利用只能利用一次
总体思路:
1、通过申请大于等于0x200000的内存,那边会用mmap分配,而这个mmap分配的内存跟libc的偏移是固定的
2、我们通过精准控制v3,将null写到top chunk指针的最低位,top chunk指针就指向了house name的最后的16字节的位置(堆地址可以通过owner泄露)
3、当然在这之前得控制house name的最后一个8字节为8个\xff,这是为house of force做的铺垫
4、然后我们就可以利用house of force,申请特定的大小让malloc返回值到house_description_addr
5、将house_description覆盖为got就可以泄露libc
6、而同时覆盖room,那就可以覆盖atoi的got来getshell了
exp
1 | #!/usr/bin/env python |